package MobileMWClient;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * <pre>
 * @Package : MobileMWClient
 * @File    : ClientSender.java
 * <pre>
 *
 * @Author  : 차재우
 * @Date    : 2013. 7. 26.
 * @Version :
 */
class ClientSender implements Runnable {
	// 클라이언트 소켓
	private Socket sock = null;
	
	// 송신 스트림
	private DataOutputStream out = null;
	private PrintWriter writer = null;
	
	// 수신 스트림
	private DataInputStream in = null;
	private BufferedReader br = null;
	
	// 송수신 큐
	private SerialQueue serialRecvQueue = null;
	private SerialQueue serialSendQueue = null;

	/**
	 * <pre>
	 * @Comment : 생성자
	 * <pre>
	 *
	 * @param socket
	 */
	public ClientSender(Socket socket, SerialQueue recvQueue, SerialQueue sendQueue) {
		this.sock = socket;
		this.serialRecvQueue = recvQueue;
		this.serialSendQueue = sendQueue;

		try {
			// 송신 스트림 생성
			out = new DataOutputStream(sock.getOutputStream());
			writer = new PrintWriter(out);
			
			// 수신 스트림 생성
			in = new DataInputStream(sock.getInputStream());
			br = new BufferedReader(new InputStreamReader(in));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * <pre>
	 * @Comment : 클라이언트 전송 스레드 시작 루틴
	 * <pre>
	 *
	 * @Method  : run
	 */
	public void run() {
		while (out != null) {
			try {
				if (this.serialRecvQueue.IsEmpty() == true)
				{
					Thread.yield();
					continue;
				}

				/****************************************************************************************
				 * 
				 * 데이터 전송
				 * 
				 ****************************************************************************************/
				// 큐에서 데이터 꺼냄
				PassData data = serialRecvQueue.Pop();
				
				// 시리얼 패킷 디코딩
				int key[] = new int[1];
				byte[] dataPart = SerialPacket.GetDataPart(data.getBytePassData(), key);
				System.out.println("client key : " + key[0]);

				// 데이터 부만 스트링으로 변환
				String sendData = ByteUtil.ConvertByteArrToStr(dataPart);

				// 미들웨어로 전송
				writer.println(sendData);
				writer.flush();
				
				System.out.println("\n***************************************************************************************************************************************");
				System.out.println("Mobile -------------------> Middleware");
				System.out.println(sendData);
				
				/****************************************************************************************
				 * 
				 * 데이터 수신
				 * 
				 ****************************************************************************************/
				// 미들웨어 응답 수신
				String recvData = br.readLine();
				
				// 시리얼 패킷 인코딩
				byte[] serialEnData = SerialPacket.MakeSerialPacket(recvData.getBytes(), key[0]);
				System.out.println("client key : " + key[0]);
				serialSendQueue.Push(serialEnData);
				
				System.out.println("Mobile <------------------- Middleware");
				System.out.println(recvData);
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
